Fix README.
Use sprintf becuase snprintf is unfortunately not in C89.
Make testo play nicer with PSP to avoid hyperactive fp differences.
tpg.c avoid sign extension.
Various style files: don't use %lf.
NOTE: sn* options require use of the '-s' command line option.
Example Usage:
- gpsbabel -i xsv,style=foo.style -f foo -o xsv,style=bar.style -F bar
- gpsbabel -s -i gpx -f foo.gpx -o xsv,style=my.style,snlen=8 -F bar
+ gpsbabel -i xcsv,style=foo.style -f foo -o xcsv,style=bar.style -F bar
+ gpsbabel -s -i gpx -f foo.gpx -o xcsv,style=my.style,snlen=8 -F bar
MAPSEND
if (strcmp(fmp->key, "IGNORE") == 0) {
/* IGNORE -- Write the char printf conversion */
- snprintf (buff, sizeof(buff), fmp->printfc, "");
+ sprintf(buff, fmp->printfc, "");
} else
if (strcmp(fmp->key, "INDEX") == 0) {
- snprintf (buff, sizeof(buff), fmp->printfc, index + atoi(fmp->val));
+ sprintf(buff, fmp->printfc, index + atoi(fmp->val));
} else
if (strcmp(fmp->key, "CONSTANT") == 0) {
- snprintf (buff, sizeof(buff), fmp->printfc, fmp->val);
+ sprintf(buff, fmp->printfc, fmp->val);
} else
if (strcmp(fmp->key, "SHORTNAME") == 0) {
- snprintf (buff, sizeof(buff), fmp->printfc, shortname);
+ sprintf(buff, fmp->printfc, shortname);
} else
if (strcmp(fmp->key, "ANYNAME") == 0) {
- snprintf (buff, sizeof(buff), fmp->printfc, anyname);
+ sprintf(buff, fmp->printfc, anyname);
} else
if (strcmp(fmp->key, "DESCRIPTION") == 0) {
- snprintf (buff, sizeof(buff), fmp->printfc, description);
+ sprintf(buff, fmp->printfc, description);
} else
if (strcmp(fmp->key, "NOTES") == 0) {
- snprintf (buff, sizeof(buff), fmp->printfc, wpt->notes);
+ sprintf(buff, fmp->printfc, wpt->notes);
} else
if (strcmp(fmp->key, "URL") == 0) {
- snprintf (buff, sizeof(buff), fmp->printfc, wpt->url);
+ sprintf(buff, fmp->printfc, wpt->url);
} else
if (strcmp(fmp->key, "URL_LINK_TEXT") == 0) {
- snprintf (buff, sizeof(buff), fmp->printfc, wpt->url_link_text);
+ sprintf(buff, fmp->printfc, wpt->url_link_text);
} else
if (strcmp(fmp->key, "ICON_DESCR") == 0) {
- snprintf (buff, sizeof(buff), fmp->printfc, wpt->icon_descr);
+ sprintf(buff, fmp->printfc, wpt->icon_descr);
} else
/* LATITUDE CONVERSION***********************************************/
if (strcmp(fmp->key, "LAT_DECIMAL") == 0) {
/* latitude as a pure decimal value */
- snprintf (buff, sizeof(buff), fmp->printfc,
- wpt->position.latitude.degrees);
+ sprintf(buff, fmp->printfc, wpt->position.latitude.degrees);
} else
if (strcmp(fmp->key, "LAT_DECIMALDIR") == 0) {
/* latitude as a decimal value with N/S after it */
- snprintf (buff, sizeof(buff), fmp->printfc,
- fabs(wpt->position.latitude.degrees),
+ sprintf(buff, fmp->printfc, fabs(wpt->position.latitude.degrees),
LAT_DIR(wpt->position.latitude.degrees));
} else
if (strcmp(fmp->key, "LAT_DIRDECIMAL") == 0) {
/* latitude as a decimal value with N/S before it */
- snprintf (buff, sizeof(buff), fmp->printfc,
+ sprintf(buff, fmp->printfc,
LAT_DIR(wpt->position.latitude.degrees),
fabs(wpt->position.latitude.degrees));
} else
if (strcmp(fmp->key, "LAT_INT32DEG") == 0) {
/* latitude as an integer offset from 0 degrees */
- snprintf (buff, sizeof(buff), fmp->printfc,
+ sprintf(buff, fmp->printfc,
dec_to_intdeg(wpt->position.latitude.degrees, 1));
} else
/* LONGITUDE CONVERSIONS*********************************************/
if (strcmp(fmp->key, "LON_DECIMAL") == 0) {
/* longitude as a pure decimal value */
- snprintf (buff, sizeof(buff), fmp->printfc,
- wpt->position.longitude.degrees);
+ sprintf(buff, fmp->printfc, wpt->position.longitude.degrees);
} else
if (strcmp(fmp->key, "LON_DECIMALDIR") == 0) {
/* latitude as a decimal value with N/S after it */
- snprintf (buff, sizeof(buff), fmp->printfc,
+ sprintf(buff, fmp->printfc,
fabs(wpt->position.longitude.degrees),
LON_DIR(wpt->position.longitude.degrees));
} else
if (strcmp(fmp->key, "LON_DIRDECIMAL") == 0) {
/* latitude as a decimal value with N/S before it */
- snprintf (buff, sizeof(buff), fmp->printfc,
+ sprintf(buff, fmp->printfc,
LON_DIR(wpt->position.longitude.degrees),
fabs(wpt->position.longitude.degrees));
} else
if (strcmp(fmp->key, "LON_INT32DEG") == 0) {
/* longitudee as an integer offset from 0 degrees */
- snprintf (buff, sizeof(buff), fmp->printfc,
+ sprintf(buff, fmp->printfc,
dec_to_intdeg(wpt->position.longitude.degrees, 0));
} else
/* DIRECTIONS *******************************************************/
if (strcmp(fmp->key, "LAT_DIR") == 0) {
/* latitude N/S as a char */
- snprintf (buff, sizeof(buff), fmp->printfc,
- LAT_DIR(wpt->position.latitude.degrees));
+ sprintf(buff, fmp->printfc,
+ LAT_DIR(wpt->position.latitude.degrees));
} else
if (strcmp(fmp->key, "LON_DIR") == 0) {
/* longitude E/W as a char */
- snprintf (buff, sizeof(buff), fmp->printfc,
+ sprintf(buff, fmp->printfc,
LON_DIR(wpt->position.longitude.degrees));
} else
/* ALTITUDE CONVERSIONS**********************************************/
if (strcmp(fmp->key, "ALT_FEET") == 0) {
/* altitude in feet as a decimal value */
- snprintf (buff, sizeof(buff), fmp->printfc,
+ sprintf(buff, fmp->printfc,
(wpt->position.altitude.altitude_meters * 3.2808));
} else
if (strcmp(fmp->key, "ALT_METERS") == 0) {
/* altitude in meters as a decimal value */
- snprintf (buff, sizeof(buff), fmp->printfc,
+ sprintf(buff, fmp->printfc,
wpt->position.altitude.altitude_meters);
} else
/* TIME CONVERSIONS**************************************************/
if (strcmp(fmp->key, "EXCEL_TIME") == 0) {
/* creation time as an excel (double) time */
- snprintf (buff, sizeof(buff), fmp->printfc,
- TIMET_TO_EXCEL(wpt->creation_time));
+ sprintf(buff, fmp->printfc, TIMET_TO_EXCEL(wpt->creation_time));
} else
if (strcmp(fmp->key, "TIMET_TIME") == 0) {
/* time as a time_t variable */
- snprintf (buff, sizeof(buff), fmp->printfc, wpt->creation_time);
+ sprintf(buff, fmp->printfc, wpt->creation_time);
} else
/* GEOCACHE STUFF **************************************************/
if (strcmp(fmp->key, "GEOCACHE_DIFF") == 0) {
/* Geocache Difficulty as a double */
- snprintf (buff, sizeof(buff), fmp->printfc,
- wpt->gc_data.diff / 10);
+ sprintf(buff, fmp->printfc, wpt->gc_data.diff / 10);
} else
if (strcmp(fmp->key, "GEOCACHE_TERR") == 0) {
/* Geocache Terrain as a double */
- snprintf (buff, sizeof(buff), fmp->printfc,
- wpt->gc_data.terr / 10);
+ sprintf(buff, fmp->printfc, wpt->gc_data.terr / 10);
} else
if (strcmp(fmp->key, "GEOCACHE_TYPE") == 0) {
/* Geocache Type TODO */
- snprintf (buff, sizeof(buff), fmp->printfc, "Geocache");
+ sprintf(buff, fmp->printfc, "Geocache");
} else {
/* this should probably never happen */
}
COMMENTS:
Anything after a hash (#) on a line is not parsed. For example:
#THIS ENTIRE LINE IS A COMMENT.
-#FIELD LAT_DECIMAL, "", "%lf" THIS ENTIRE LINE IS A COMMENT
-FIELD LAT_DECIMAL, "", "%lf" # ONLY THIS SENTENCE IS A COMMENT.
+#FIELD LAT_DECIMAL, "", "%f" THIS ENTIRE LINE IS A COMMENT
+FIELD LAT_DECIMAL, "", "%f" # ONLY THIS SENTENCE IS A COMMENT.
DEFINING THE LAYOUT OF THE FILE:
signed decimal format (i.e. -91.0000). This data is handled internally as
a DOUBLE PRECISION FLOAT and requires a FLOATING POINT printf conversion.
- example: IFIELD LAT_DECIMAL,"","%lf"
+ example: IFIELD LAT_DECIMAL,"","%f"
o LON_DECIMAL
See LAT_DECIMAL, except LON_DECIMAL defines LONGITUDE.
character appears before (LAT_DIRDECIMAL) or after (LAT_DECIMALDIR) the
decimal number.
- example: IFIELD LAT_DECIMALDIR,"","%lf %c"
- example: IFIELD LAT_DIRDECIMAL,"","%c %08.5lf"
+ example: IFIELD LAT_DECIMALDIR,"","%f %c" (writes 31.333 N)
+ example: IFIELD LAT_DIRDECIMAL,"","%c %f" (writes N 31.333)
o LON_DECIMALDIR / LON_DIRDECIMAL
Same as LAT_DECIMALDIR / LAT_DIRDECIMAL except LON_ defines LONGITUDE.
a SIGNED DOUBLE PRECISION FLOAT and requires a FLOATING POINT printf
conversion.
- example: IFIELD ALT_FEET,"","%.0lf"
+ example: IFIELD ALT_FEET,"","%.0f"
o ALT_METERS
ALT_METERS is identical to ALT_FEET with the exception that the altitude
the decimal days since 1/1/1900 and is handled internally as a DOUBLE
PRECISION FLOAT and requires a FLOATING POINT printf conversion.
- example: IFIELD EXCEL_TIME,"","%11.5lf"
+ example: IFIELD EXCEL_TIME,"","%11.5f"
o TIMET_TIME
TIMET_TIME is the waypoint's creation time, if any. This is actually
#
# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:
#
-IFIELD LAT_DECIMAL, "", "%08.5lf"
-IFIELD LON_DECIMAL, "", "%08.5lf"
+IFIELD LAT_DECIMAL, "", "%08.5f"
+IFIELD LON_DECIMAL, "", "%08.5f"
IFIELD DESCRIPTION, "", "%s"
#
IFIELD CONSTANT, "", "CONSTANT"
IFIELD INDEX, "", "%d"
-IFIELD LAT_DECIMAL, "", "%lf"
+IFIELD LAT_DECIMAL, "", "%f"
IFIELD LAT_DIR, "", "%c"
-IFIELD LON_DECIMAL, "", "%lf"
+IFIELD LON_DECIMAL, "", "%f"
IFIELD LON_DIR, "", "%c"
IFIELD ICON_DESCR, "", "%s"
IFIELD SHORTNAME, "", "%s"
IFIELD NOTES, "", "%s"
IFIELD URL, "", "%s"
IFIELD URL_LINK_TEXT, "", "%s"
-IFIELD ALT_METERS, "", "%lfM"
-IFIELD ALT_FEET, "", "%lfF"
-IFIELD LAT_DECIMALDIR, "", "%lf/%c"
-IFIELD LON_DECIMALDIR, "", "%lf/%c"
-IFIELD LAT_DIRDECIMAL, "", "%c/%lf"
-IFIELD LON_DIRDECIMAL, "", "%c/%lf"
+IFIELD ALT_METERS, "", "%fM"
+IFIELD ALT_FEET, "", "%fF"
+IFIELD LAT_DECIMALDIR, "", "%f/%c"
+IFIELD LON_DECIMALDIR, "", "%f/%c"
+IFIELD LAT_DIRDECIMAL, "", "%c/%f"
+IFIELD LON_DIRDECIMAL, "", "%c/%f"
IFIELD LAT_INT32DEG, "", "%ld"
IFIELD LON_INT32DEG, "", "%ld"
IFIELD TIMET_TIME, "", "%ld"
-IFIELD EXCEL_TIME, "", "%lf"
+IFIELD EXCEL_TIME, "", "%f"
# EPILOGUE:
EPILOGUE Epilogue Line 1
# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:
#
IFIELD INDEX, "", "%d"
-IFIELD LAT_DECIMAL, "", "%08.5lf"
-IFIELD LON_DECIMAL, "", "%08.5lf"
+IFIELD LAT_DECIMAL, "", "%08.5f"
+IFIELD LON_DECIMAL, "", "%08.5f"
IFIELD DESCRIPTION, "", "%s"
# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:
IFIELD ANYNAME, "", "%s"
-IFIELD LAT_DECIMAL, "", "%08.5lf"
-IFIELD LON_DECIMAL, "", "%08.5lf"
+IFIELD LAT_DECIMAL, "", "%08.5f"
+IFIELD LON_DECIMAL, "", "%08.5f"
#
IFIELD SHORTNAME, "", "%-8.8s"
IFIELD DESCRIPTION, "", "%s"
-IFIELD LAT_DIRDECIMAL, "", "%c%lf"
-IFIELD LON_DIRDECIMAL, "", "%c%lf"
+IFIELD LAT_DIRDECIMAL, "", "%c%f"
+IFIELD LON_DIRDECIMAL, "", "%c%f"
IFIELD IGNORE, "", "%s"
# gpsman.c likes mkshort len = 8, whitespace = 0.
IFIELD IGNORE, "", "%s" # RC
IFIELD IGNORE, "", "%s" # UFI
IFIELD IGNORE, "", "%s" # UNI
-IFIELD LAT_DECIMAL, "", "%lf" # DD_LAT
-IFIELD LON_DECIMAL, "", "%lf" # DD_LON
+IFIELD LAT_DECIMAL, "", "%f" # DD_LAT
+IFIELD LON_DECIMAL, "", "%f" # DD_LON
IFIELD IGNORE, "", "%s" # DMS_LAT
IFIELD IGNORE, "", "%s" # DMS_LON
IFIELD IGNORE, "", "%s" # UTM
#
IFIELD INDEX, "1", "%4d"
IFIELD SHORTNAME, "", "%-14.14s"
-IFIELD LAT_DECIMAL, "", "%11.6lf"
-IFIELD LON_DECIMAL, "", "%11.6lf"
-IFIELD EXCEL_TIME, "", "%011.5lf"
+IFIELD LAT_DECIMAL, "", "%11.6f"
+IFIELD LON_DECIMAL, "", "%11.6f"
+IFIELD EXCEL_TIME, "", "%011.5f"
IFIELD CONSTANT, "0", "%3s" # icon
IFIELD CONSTANT, "1", "%2s" # 1
IFIELD CONSTANT, "3", "%2s" # display format opts
IFIELD CONSTANT, "0", "%2s" # pointer direction
IFIELD CONSTANT, "0", "%2s" # garmin display flags
IFIELD CONSTANT, "0", "%5s" # proximity distance
-IFIELD ALT_FEET, "", "%7.0lf"
+IFIELD ALT_FEET, "", "%7.0f"
IFIELD CONSTANT, "6", "%2s" # waypt name text size
IFIELD CONSTANT, "0", "%2s" # bold checkbox
IFIELD CONSTANT, "17", "%2s" # symbol size
# HAVE OUR WAY WITH THE FORMATTING.
#
IFIELD SHORTNAME, "", "%s" # Name
-IFIELD LAT_DECIMAL, "", "%lf" # Latitude
-IFIELD LON_DECIMAL, "", "%lf" # Longitude
+IFIELD LAT_DECIMAL, "", "%f" # Latitude
+IFIELD LON_DECIMAL, "", "%f" # Longitude
IFIELD DESCRIPTION, "", "%s" # Name 2 (Big Description)
IFIELD URL, "", "%s" # URL
IFIELD IGNORE, "", "" # Holder for Geocache Type
#
# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:
#
-IFIELD LON_DECIMAL, "", "%lf"
-IFIELD LAT_DECIMAL, "", "%lf"
+IFIELD LON_DECIMAL, "", "%f"
+IFIELD LAT_DECIMAL, "", "%f"
IFIELD CONSTANT, "redpin", "%s"
IFIELD DESCRIPTION, "", "%s"
#
# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:
#
-IFIELD LAT_DECIMAL, "", "%08.5lf"
-IFIELD LON_DECIMAL, "", "%08.5lf"
+IFIELD LAT_DECIMAL, "", "%08.5f"
+IFIELD LON_DECIMAL, "", "%08.5f"
IFIELD DESCRIPTION, "", "%s"
${PNAME} -i dna -f reference/dnatest.txt -o dna -F ${TMPDIR}/dnatest.txt
diff ${TMPDIR}/dnatest.txt reference/dnatest.txt
-# PSP (PocketStreets 2002 Pushpin (.PSP)) file format
-rm -f ${TMPDIR}/ps.psp ${TMPDIR}/psp.psp
-${PNAME} -i psp -f reference/ps.psp -o psp -F ${TMPDIR}/psp.psp
-${PNAME} -i psp -f ${TMPDIR}/psp.psp -o psp -F ${TMPDIR}/ps.psp
-diff ${TMPDIR}/ps.psp reference
+# PSP (PocketStreets 2002 Pushpin (.PSP)) file format. Use mxf as an
+# intermediate format to avoid binary FP anomalies on different platforms.
+rm -f ${TMPDIR}/psp.mxf ${TMPDIR}/mxf.psp
+${PNAME} -i psp -f reference/ps.psp -o mxf -F ${TMPDIR}/psp.mxf
+${PNAME} -i geo -f geocaching.loc -o mxf -F ${TMPDIR}/mxf.psp
+diff ${TMPDIR}/psp.mxf ${TMPDIR}/mxf.psp
# MXF (Maptech Exchange Format) file format
rm -f ${TMPDIR}/mx.mxf ${TMPDIR}/mxf.mxf
char *description;
/* these unknown 4 are probably point properties (color, icon, etc..) */
- char unknown4[] = { 0x78, 0x56, 0x34, 0x12 };
+ unsigned char unknown4[] = { 0x78, 0x56, 0x34, 0x12 };
/* these 2 appear to be constant across test files */
- char unknown2[] = { 0x01, 0x80 };
+ unsigned char unknown2[] = { 0x01, 0x80 };
/* this output format pretty much requires a description
* and a shortname